package com.etime.shycourse.services.impl;

import com.etime.shycourse.config.Tools;
import com.etime.shycourse.dao.ChapterMapper;
import com.etime.shycourse.dao.LessonMapper;
import com.etime.shycourse.dao.MediabankMapper;
import com.etime.shycourse.dao.SysUserMapper;
import com.etime.shycourse.dto.CurrentUser;
import com.etime.shycourse.dto.LessonAndMediaBankDto;
import com.etime.shycourse.dto.LessonAndMediaBankDtos;
import com.etime.shycourse.pojo.Chapter;
import com.etime.shycourse.pojo.Lesson;
import com.etime.shycourse.pojo.Mediabank;
import com.etime.shycourse.pojo.SysUser;
import com.etime.shycourse.services.interfaces.LessonServices;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 课时服务实现类
 * </p>
 *
 * @author wb
 * @since 2021-12-22
 */
@Service
public class LessonServiceImpl implements LessonServices {
    @Autowired
    LessonMapper mapper;
    @Autowired
    SysUserMapper userMapper;
    @Autowired
    ChapterMapper cMapper;
    @Autowired
    MediabankMapper meMapper;
    @Autowired
    Tools tools;

    /**
     * 修改一条数据 课时
     * 根据课时id修改 lessonid
     *
     * @param lesson
     * @return int
     */
    @Override

    public int updateLessonById(Lesson lesson) {
        // 设置默认: 最后修改时间=当前时间
        lesson.setLessonupdatetime(new Date());
        return mapper.updateById(lesson);
    }

    /**
     * 查询课时一条类型 课时内容+多媒体
     * 根据课时id
     *
     * @param lessonId
     * @return Lesson
     */
    @Override
    public LessonAndMediaBankDto selectLessonAndMediaBankDtoBy(Integer lessonId) {
        LessonAndMediaBankDto dto = null;
        Lesson lesson = mapper.selectById(lessonId);
        if (lesson != null) {
            dto = new LessonAndMediaBankDto();
            Mediabank mediabank = null;
            // 判断有没有 多媒体临时表id
            if (lesson.getLessonmediaid() != null) {
                mediabank = meMapper.selectById(lesson.getLessonmediaid());
                dto.setMediabank(mediabank);
            }
            dto.setLesson(lesson);

        }
        return dto;
    }

    /**
     * 根据课程id 查询所有其课程中所的课时 文本+视频
     *
     * @param chapterId
     * @return chapterLessonDto
     */
    @Override
    public List<LessonAndMediaBankDtos> selectLessonList(Integer chapterId) {
        // 查询所有其课程中所的课时 文本+视频
        List<LessonAndMediaBankDtos> dto = mapper.selectLessonAndMediaBankList(chapterId);
        // 如果没有就只查询 文本
        return dto.size() > 1 ? dto : mapper.selectLessons(chapterId);
    }

    /**
     * 根据课程id courseId 查询到 章节和课时的详细信息
     * 一个课程里面有多个课时
     *
     * @param courseId 课程id
     * @return ListMessage<Chapter>
     */
    @Override
    public List<Chapter> selectCourseLessonByIds(Integer courseId) {
        if (courseId != null) {
            return cMapper.selectCourseLessonAllById(courseId);
        }
        return null;
    }

    /**
     * 添加一条数据 课时
     * 改为token 2022 - 01 - 21 17:08:13
     *
     * @param lesson 默认数据
     *               lessonuserid 课时发布人id = 登录用户的id
     *               lessonusertruename 课时发布人姓名 = 登录用户的姓名
     *               lessoncreatetime 课时创建时间 = 当前时间
     *               lessonupdatetime 课时最后修改时间 = 当前时间
     *               lessonviewnum 课时查看次数 = 0
     *               lessonbuynum 课时购买次数 =0
     *               lessonstate 课时状态 =1 （默认发布）
     *               lessontriable = 0 （目前不开放试听功能）
     *               lessontrylen 允许试听时长 = 0
     * @return int
     */
    @Override
    public int insertLesson(Lesson lesson, String token) {
        if (lesson != null) {
            SysUser sysUser;
            //改为token 2022 - 01 - 21 17:08:13
            CurrentUser user = tools.getCurrentUserFromRedis(token);
            // 为了前期测试 后期在从redis中使用token获取
            //课时发布人id = 登录用户的id
            lesson.setLessonuserid(user.getUser().getUserid());
            //课时发布人姓名 = 登录用户的姓名
            lesson.setLessonusertruename(user.getUser().getUsertruename());
            if (lesson.getLessontype() == null) {
                //课时类型 默认：video
                lesson.setLessontype("video");
            }
            //默认 课时最后修改时间 = 当前时间
            //默认 课时最后修改时间 = 当前时间
            lesson.setLessonupdatetime(new Date());
            //默认 课时创建时间 = 当前时间
            lesson.setLessoncreatetime(new Date());
            //默认 课时查看次数 = 0
            lesson.setLessonviewnum(0);
            //默认 课时购买次数 =0
            lesson.setLessonbuynum(0);
            //默认 课时状态 =1 （默认发布）
            lesson.setLessonstate(1);
            if (lesson.getLessontriable() == null) {
                //默认 是否允许试听 = 0 （目前不开放试听功能）
                lesson.setLessontriable(0);
            }
            if (lesson.getLessontrylen() == null) {
                //默认 允许试听时长 = 0
                lesson.setLessontrylen(0);
            }
            return mapper.insert(lesson);
        }
        return 0;
    }

    /**
     * 添加一条数据 课时
     *
     * @param mediabank 默认数据
     *                  mediatitle	        文件名称       源文件的名称
     *                  mediatype           文件类型	保存源文件的后缀名
     *                  mediaurl            文件路径	文件上传后，返回的路径
     *                  medialen            播放时间	视频的播放时长	          可以在上传时，用js获取
     *                  mediacreatetime     文件创建时间	当前时间
     *                  mediauserid         文件上传人id	当前登录人id	         从redis中使用token获取
     *                  mediausertruename   文件上传人姓名 当前登录人姓名    	从redis中使用token获取
     *                  mediastate          文件状态	默认：0(待转码)
     *                  mediadelete         文件删除状态	默认：0（正常）
     *                  mediaauditstate     文件审核状态	默认：1（已审核）
     *                  mediaauditdesc      文件审核意见	    空
     *                  mediaaudituserid    文件审核人id	    空
     *                  mediaauditname      文件审核人姓名	空
     * @return mediabank的 id (mediaid)
     */
    @Override
    public int insertMediaBank(Mediabank mediabank, String token) {
        if (mediabank != null) {
            CurrentUser user = tools.getCurrentUserFromRedis(token);
            // 设置文件上传人姓名 当前登录人姓名
            mediabank.setMediausertruename(user.getUser().getUsertruename());
            // 设置文件上传人id	当前登录人id
            mediabank.setMediauserid(user.getUser().getUserid());
            if (mediabank.getMediatype() == null) {
                mediabank.setMediatype("video");
            }
            if (mediabank.getMediastate() == null) {
                // 文件状态	默认：0(待转码)
                mediabank.setMediastate(0);
            }
            // 文件删除状态	默认：0（正常）
            mediabank.setMediadelete(0);
            if (mediabank.getMediaauditstate() == null) {
                // 文件审核状态	默认：1（已审核）
                mediabank.setMediaauditstate(1);
            }
            // 文件创建时间	默认当前时间
            mediabank.setMediacreatetime(new Date());

            return meMapper.insert(mediabank) > 0 ? mediabank.getMediaid() : 0;
        }
        return 0;
    }


    /**
     * 上传课时中包含文件
     * 改为token
     *
     * @param dtos LessonAndMediaBankDto
     * @return int 成功 >0 失败=0
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int insertMediaBankAndLesson(LessonAndMediaBankDto dtos, String token) {

        if (dtos != null) {
            int mediaId; //插入 视频的返回的mediaid
            int iLesson; //插入 课时的返回的值
           /*  为了前期测试 后期在从redis中 使用token获取
            SysUser sysUser = userMapper.selectById (dtos.getLesson ().getLessonuserid ());
            //System.out.println ("sysUser.toString () = " + sysUser.toString ());
            if (sysUser == null) {
                // 如果没有该用户 则返回 0
                return 0;
            }*/
            try {
                // 插入 视频的返回的 mediaid
                mediaId = insertMediaBank(dtos.getMediabank(), token);
                if (mediaId == 0) {
                    throw new Exception("添加视频信息失败！");
                }
                // 把视频的id 存在课时文本中
                dtos.getLesson().setLessonmediaid(mediaId);
                iLesson = insertLesson(dtos.getLesson(), token);
                if (iLesson == 0) {
                    throw new Exception("添加课时信息失败！");
                }
            } catch (Exception e) {
                e.printStackTrace();
                // @Transactional和try catch捕获异常会让注解失效
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return 0;
            }
            return iLesson;
        }
        return 0;
    }

    /**
     * 修改一条数据 课时信息+多媒体文件信息
     * 根据课时id修改 dto.lessonid
     * 根据视频id修改 dto.mediaid
     *
     * @param dto
     * @return int
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int updateLessonMediaBankById(LessonAndMediaBankDto dto) {
        int upMediaBank; //更新多媒体文件信息的返回值
        int upLesson; //更新课时信息的返回值
        if (dto != null) {
            try {
                upMediaBank = meMapper.updateById(dto.getMediabank());
                if (upMediaBank == 0) {
                    throw new Exception("更新多媒体文件信息失败！");
                }
                upLesson = updateLessonById(dto.getLesson());
                if (upLesson == 0) {
                    throw new Exception("更新课时信息失败！");
                }
            } catch (Exception e) {
                e.printStackTrace();
                // @Transactional和try catch捕获异常会让注解失效
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return 0;
            }
            return upLesson;
        }
        return 0;
    }

    /**
     * 根据课时id 物理删除课时
     * 删除成功返回=1 失败=返回0
     *
     * @param LessonId
     * @return int
     */
    @Override
    public int deleteLessonById(Integer LessonId) {
        if (LessonId != null) {
            return mapper.deleteById(LessonId);
        }
        return 0;
    }
}
